function TF = addFile2proj(prjObj, fileName, varargin)
% 函数功能：将文件添加到MATLAB项目中
% 输入参数：
%   prjObj - MATLAB项目对象
%   fileName - 要添加的文件名或文件夹路径
%   varargin - 可选参数，包括IncludingChildFiles、categoryName、labelName等
% 输出参数：
%   TF - 布尔值，表示文件是否成功添加到项目中

% 初始化返回值为false
TF = false;

% 检查输入参数的有效性：如果文件名为空或项目对象不是matlab.project.Project类型，则直接返回
if isempty(fileName) || ~isa(prjObj,'matlab.project.Project')
    return
end

% 初始化IncludingChildFiles标志为false
IncludingChildFiles = false;
% 如果输入参数数量大于2，处理可选参数
if nargin > 2
    % 遍历所有可选参数
    for i = 1:numel(varargin)
        % 检查是否包含'IncludingChildFiles'参数
        if strcmp(varargin{i},'IncludingChildFiles')
            IncludingChildFiles = true;
        end
    end
end

% 判断输入的是文件夹还是文件
if isfolder(fileName)
    % 如果是文件夹，直接使用完整路径
    fullpath = fileName;
    % 检查文件夹是否存在，如果不存在则返回
    if ~exist(fullpath,"dir")
        return
    end
else
    % 如果是文件，首先检查是否已是完整路径
    if exist(fileName, 'file') == 2
        fullpath = fileName;
    else
        % 使用which函数获取完整路径
        fullpath = which(fileName);
        % 如果找不到文件，则返回
        if isempty(fullpath)
            return
        end
    end
end

% 在项目中查找文件是否已存在
existingFile = findFile(prjObj,fullpath);

% 如果文件不存在于项目中
if isempty(existingFile)
    % 根据IncludingChildFiles标志决定添加方式
    if IncludingChildFiles
        % 如果包含子文件，使用addFolderIncludingChildFiles函数
        addedFile = addFolderIncludingChildFiles(prjObj, fullpath);
    else
        % 否则使用addFile函数添加单个文件
        % 基于规则第2条：不使用which()避免潜在的路径搜索问题
        addedFile = addFile(prjObj, fullpath);
    end
    % 如果输入参数数量大于3，说明需要添加标签
    if nargin > 3
        % 根据IncludingChildFiles标志确定参数位置
        if IncludingChildFiles
            categoryName = varargin{2};  % 类别名称
            labelName = varargin{3};     % 标签名称
        else
            categoryName = varargin{1};  % 类别名称
            labelName = varargin{2};     % 标签名称
        end
        % 为添加的文件添加标签
        addLabel(addedFile, categoryName, labelName);
    end
    % 如果文件成功添加，设置返回值为true
    if ~isempty(addedFile)
        TF = true;
    end
else
    % 如果文件已存在于项目中，返回true
    TF = true; % 如果文件已存在于项目中，返回true
end

end